<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.5.2" />
<title>Gerrit Code Review - Git Replication</title>
<style type="text/css">
/* Debug borders */
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
/*
  border: 1px solid red;
*/
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
  color: navy;
}

strong {
  font-weight: bold;
  color: #083194;
}

tt {
  color: navy;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  font-family: sans-serif;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}

div.sectionbody {
  font-family: serif;
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

ul, ol, li > p {
  margin-top: 0;
}

pre {
  padding: 0;
  margin: 0;
}

span#author {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  font-size: 1.1em;
}
span#email {
}
span#revnumber, span#revdate, span#revremark {
  font-family: sans-serif;
}

div#footer {
  font-family: sans-serif;
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
div#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
div#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

div#preamble {
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-top: 1.0em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.0em;
  margin-bottom: 2.0em;
  margin-right: 10%;
  color: #606060;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}

div.listingblock > div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock, div.verseblock {
  padding-left: 1.0em;
  margin-left: 1.0em;
  margin-right: 10%;
  border-left: 5px solid #dddddd;
  color: #777777;
}

div.quoteblock > div.attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock > div.content {
  white-space: pre;
}
div.verseblock > div.attribution {
  padding-top: 0.75em;
  text-align: left;
}
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 3px solid #dddddd;
}

div.exampleblock > div.content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

div.imageblock div.content { padding-left: 0; }
span.image img { border-style: none; }
a.image:visited { color: white; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: normal;
  color: navy;
}
dd > *:first-child {
  margin-top: 0.1em;
}

ul, ol {
    list-style-position: outside;
}
ol.arabic {
  list-style-type: decimal;
}
ol.loweralpha {
  list-style-type: lower-alpha;
}
ol.upperalpha {
  list-style-type: upper-alpha;
}
ol.lowerroman {
  list-style-type: lower-roman;
}
ol.upperroman {
  list-style-type: upper-roman;
}

div.compact ul, div.compact ol,
div.compact p, div.compact p,
div.compact div, div.compact div {
  margin-top: 0.1em;
  margin-bottom: 0.1em;
}

div.tableblock > table {
  border: 3px solid #527bbd;
}
thead, p.table.header {
  font-family: sans-serif;
  font-weight: bold;
}
tfoot {
  font-weight: bold;
}
td > div.verse {
  white-space: pre;
}
p.table {
  margin-top: 0;
}
/* Because the table frame attribute is overriden by CSS in most browsers. */
div.tableblock > table[frame="void"] {
  border-style: none;
}
div.tableblock > table[frame="hsides"] {
  border-left-style: none;
  border-right-style: none;
}
div.tableblock > table[frame="vsides"] {
  border-top-style: none;
  border-bottom-style: none;
}


div.hdlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hdlist tr {
  padding-bottom: 15px;
}
dt.hdlist1.strong, td.hdlist1.strong {
  font-weight: bold;
}
td.hdlist1 {
  vertical-align: top;
  font-style: normal;
  padding-right: 0.8em;
  color: navy;
}
td.hdlist2 {
  vertical-align: top;
}
div.hdlist.compact tr {
  margin: 0;
  padding-bottom: 0;
}

.comment {
  background: yellow;
}

.footnote, .footnoteref {
  font-size: 0.8em;
}

span.footnote, span.footnoteref {
  vertical-align: super;
}

#footnotes {
  margin: 20px 0 20px 0;
  padding: 7px 0 0 0;
}

#footnotes div.footnote {
  margin: 0 0 5px 0;
}

#footnotes hr {
  border: none;
  border-top: 1px solid silver;
  height: 1px;
  text-align: left;
  margin-left: 0;
  width: 20%;
  min-width: 100px;
}


@media print {
  div#footer-badges { display: none; }
}

div#toc {
  margin-bottom: 2.5em;
}

div#toctitle {
  color: #527bbd;
  font-family: sans-serif;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}
/* Workarounds for IE6's broken and incomplete CSS2. */

div.sidebar-content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}
div.sidebar-title, div.image-title {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  margin-top: 0.0em;
  margin-bottom: 0.5em;
}

div.listingblock div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock-attribution {
  padding-top: 0.5em;
  text-align: right;
}

div.verseblock-content {
  white-space: pre;
}
div.verseblock-attribution {
  padding-top: 0.75em;
  text-align: left;
}

div.exampleblock-content {
  border-left: 3px solid #dddddd;
  padding-left: 0.5em;
}

/* IE6 sets dynamically generated links as visited. */
div#toc a:visited { color: blue; }
</style>
<script type="text/javascript">
/*<![CDATA[*/
window.onload = function(){asciidoc.footnotes(); asciidoc.toc(2);}
var asciidoc = {  // Namespace.

/////////////////////////////////////////////////////////////////////
// Table Of Contents generator
/////////////////////////////////////////////////////////////////////

/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, 2006, 2009. License: GPL */

// toclevels = 1..4.
toc: function (toclevels) {

  function getText(el) {
    var text = "";
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
        text += i.data;
      else if (i.firstChild != null)
        text += getText(i);
    }
    return text;
  }

  function TocEntry(el, text, toclevel) {
    this.element = el;
    this.text = text;
    this.toclevel = toclevel;
  }

  function tocEntries(el, toclevels) {
    var result = new Array;
    var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
    // Function that scans the DOM tree for header elements (the DOM2
    // nodeIterator API would be a better technique but not supported by all
    // browsers).
    var iterate = function (el) {
      for (var i = el.firstChild; i != null; i = i.nextSibling) {
        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
          var mo = re.exec(i.tagName);
          if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
          }
          iterate(i);
        }
      }
    }
    iterate(el);
    return result;
  }

  var toc = document.getElementById("toc");
  var entries = tocEntries(document.getElementById("content"), toclevels);
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.element.id == "")
      entry.element.id = "_toc_" + i;
    var a = document.createElement("a");
    a.href = "#" + entry.element.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
  if (entries.length == 0)
    toc.parentNode.removeChild(toc);
},


/////////////////////////////////////////////////////////////////////
// Footnotes generator
/////////////////////////////////////////////////////////////////////

/* Based on footnote generation code from:
 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
 */

footnotes: function () {
  var cont = document.getElementById("content");
  var noteholder = document.getElementById("footnotes");
  var spans = cont.getElementsByTagName("span");
  var refs = {};
  var n = 0;
  for (i=0; i<spans.length; i++) {
    if (spans[i].className == "footnote") {
      n++;
      // Use [\s\S] in place of . so multi-line matches work.
      // Because JavaScript has no s (dotall) regex flag.
      note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
      noteholder.innerHTML +=
        "<div class='footnote' id='_footnote_" + n + "'>" +
        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
        n + "</a>. " + note + "</div>";
      spans[i].innerHTML =
        "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
        "' title='View footnote' class='footnote'>" + n + "</a>]";
      var id =spans[i].getAttribute("id");
      if (id != null) refs["#"+id] = n;
    }
  }
  if (n == 0)
    noteholder.parentNode.removeChild(noteholder);
  else {
    // Process footnoterefs.
    for (i=0; i<spans.length; i++) {
      if (spans[i].className == "footnoteref") {
        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
        href = href.match(/#.*/)[0];  // Because IE return full URL.
        n = refs[href];
        spans[i].innerHTML =
          "[<a href='#_footnote_" + n +
          "' title='View footnote' class='footnote'>" + n + "</a>]";
      }
    }
  }
}

}
/*]]>*/
</script>
</head>
<body>
<div id="header">
<h1>Gerrit Code Review - Git Replication</h1>
<span id="revnumber">version 2.3</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="content">
<div id="preamble">
<div class="sectionbody">
<div class="paragraph"><p>Gerrit can automatically push any changes it makes to its managed Git
repositories to another system.  Usually this would be configured to
provide mirroring of changes, for warm-standby backups, or a
load-balanced public mirror farm.</p></div>
<div class="paragraph"><p>The replication runs on a short delay.  This gives Gerrit a small
time window to batch updates going to the same project, such as
when a user uploads multiple changes at once.</p></div>
<div class="paragraph"><p>Typically replication should be done over SSH, with a passwordless
public/private key pair.  On a trusted network it is also possible to
use replication over the insecure (but much faster) git:// protocol,
by enabling the <tt>receive-pack</tt> service on the receiving system, but
this configuration is not recommended.  It is also possible to
specify a local path as replication target. This makes e.g. sense if
a network share is mounted to which the repositories should be
replicated.</p></div>
</div>
</div>
<h2 id="_enabling_replication">Enabling Replication</h2>
<div class="sectionbody">
<div class="paragraph"><p>If replicating over SSH (recommended), ensure the host key of the
remote system(s) is already in the Gerrit user&#8217;s <tt>~/.ssh/known_hosts</tt>
file.  The easiest way to add the host key is to connect once by hand
with the command line:</p></div>
<div class="exampleblock">
<div class="exampleblock-content">
<div class="literalblock">
<div class="content">
<pre><tt>sudo su -c 'ssh mirror1.us.some.org echo' gerrit2</tt></pre>
</div></div>
</div></div>
<div class="paragraph"><p>Next, create <tt>'$site_path'/etc/replication.config</tt> as a Git-style
config file, and restart Gerrit.</p></div>
<div class="paragraph"><p>Example <tt>replication.config</tt> to replicate in parallel to four
different hosts:</p></div>
<div class="exampleblock">
<div class="exampleblock-content">
<div class="literalblock">
<div class="content">
<pre><tt>[remote "host-one"]
  url = gerrit2@host-one.example.com:/some/path/${name}.git</tt></pre>
</div></div>
<div class="literalblock">
<div class="content">
<pre><tt>[remote "pubmirror"]
  url = mirror1.us.some.org:/pub/git/${name}.git
  url = mirror2.us.some.org:/pub/git/${name}.git
  url = mirror3.us.some.org:/pub/git/${name}.git
  push = +refs/heads/*:refs/heads/*
  push = +refs/tags/*:refs/tags/*
  threads = 3
  authGroup = Public Mirror Group
  authGroup = Second Public Mirror Group</tt></pre>
</div></div>
</div></div>
<div class="paragraph"><p>To manually trigger replication at runtime, see
<a href="cmd-replicate.html">gerrit replicate</a>.</p></div>
</div>
<h2 id="_a_id_replication_config_a_file_tt_replication_config_tt"><a id="replication_config"></a>File <tt>replication.config</tt></h2>
<div class="sectionbody">
<div class="paragraph"><p>The optional file <tt>'$site_path'/etc/replication.config</tt> is a
Git-style config file that controls the replication settings for
Gerrit.</p></div>
<div class="paragraph"><p>The file is composed of one or more <tt>remote</tt> sections, each remote
section provides common configuration settings for one or more
destination URLs.</p></div>
<div class="paragraph"><p>Each remote section uses its own thread pool.  If pushing to
multiple remotes, over differing types of network connections
(e.g. LAN and also public Internet), its a good idea to put them
into different remote sections, so that replication to the slower
connection does not starve out the faster local one.  The example
file above does this.</p></div>
<h3 id="_a_id_remote_a_section_remote"><a id="remote"></a>Section remote</h3><div style="clear:left"></div>
<div class="paragraph"><p>In the keys below, the &lt;name&gt; portion is unused by Gerrit, but must be
unique to distinguish the different sections if more than one remote
section appears in the file.</p></div>
<div class="dlist"><dl>
<dt class="hdlist1">
<a id="remote.name.url"></a>remote.&lt;name&gt;.url
</dt>
<dd>
<div class="paragraph"><p>Address of the remote server to push to.  Multiple URLs may
be specified within a single remote block, listing different
destinations which share the same settings.  Assuming sufficient
threads in the thread pool, Gerrit pushes to all URLs in parallel,
using one thread per URL.</p></div>
<div class="paragraph"><p>Within each URL value the magic placeholder <tt>${name}</tt> is replaced
with the Gerrit project name.  This is a Gerrit specific extension
to the otherwise standard Git URL syntax and it must be included
in each URL so that Gerrit can figure out where each project needs
to be replicated.</p></div>
<div class="paragraph"><p>See <a href="http://www.kernel.org/pub/software/scm/git/docs/git-push.html#URLS">GIT URLS</a>
for details on Git URL syntax.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.url"></a>remote.&lt;name&gt;.adminUrl
</dt>
<dd>
<div class="paragraph"><p>Address of the alternative remote server only for repository creation.  Multiple URLs may
be specified within a single remote block, listing different
destinations which share the same settings.</p></div>
<div class="paragraph"><p>The adminUrl can be used as a ssh alternative to the url option, but only related to repository creation.
If not specified, the repository creation tries to follow the default way through the url value specified.</p></div>
<div class="paragraph"><p>It is useful when remote.&lt;name&gt;.url protocols does not allow repository creation
although their usage are mandatory in the local environment.
In that case, an alternative ssh url could be specified to repository creation.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.receivepack"></a>remote.&lt;name&gt;.receivepack
</dt>
<dd>
<div class="paragraph"><p>Path of the <tt>git-receive-pack</tt> executable on the remote system, if
using the SSH transport.</p></div>
<div class="paragraph"><p>Defaults to <tt>git-receive-pack</tt>.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.uploadpack"></a>remote.&lt;name&gt;.uploadpack
</dt>
<dd>
<div class="paragraph"><p>Path of the <tt>git-upload-pack</tt> executable on the remote system, if
using the SSH transport.</p></div>
<div class="paragraph"><p>Defaults to <tt>git-upload-pack</tt>.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.push"></a>remote.&lt;name&gt;.push
</dt>
<dd>
<div class="paragraph"><p>Standard Git refspec denoting what should be replicated.  Setting this
to <tt>+refs/heads/*:refs/heads/*</tt> would mirror only the active
branches, but not the change refs under <tt>refs/changes/</tt>, or the tags
under <tt>refs/tags/</tt>.</p></div>
<div class="paragraph"><p>Multiple push keys can be supplied, to specify multiple patterns
to match against.  In the example file above, remote "pubmirror"
uses two push keys to match both <tt>refs/heads/*</tt> and <tt>refs/tags/*</tt>,
but excludes all others, including <tt>refs/changes/*</tt>.</p></div>
<div class="paragraph"><p>Defaults to <tt>+refs/*:refs/*</tt> (all refs) if not specified.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.timeout"></a>remote.&lt;name&gt;.timeout
</dt>
<dd>
<div class="paragraph"><p>Number of seconds to wait for a network read or write to complete
before giving up and declaring the remote side is not responding.
If 0, there is no timeout, and the push client waits indefinitely.</p></div>
<div class="paragraph"><p>A timeout should be large enough to mostly transfer the objects to
the other side.  1 second may be too small for larger projects,
especially over a WAN link, while 10-30 seconds is a much more
reasonable timeout value.</p></div>
<div class="paragraph"><p>Defaults to 0 seconds, wait indefinitely.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.replicationDelay"></a>remote.&lt;name&gt;.replicationDelay
</dt>
<dd>
<div class="paragraph"><p>Number of seconds to wait before scheduling a remote push operation.
Setting the delay to 0 effectively disables the delay, causing the
push to start as soon as possible.</p></div>
<div class="paragraph"><p>This is a Gerrit specific extension to the Git remote block.</p></div>
<div class="paragraph"><p>By default, 15 seconds.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.replicationRetry"></a>remote.&lt;name&gt;.replicationRetry
</dt>
<dd>
<div class="paragraph"><p>Number of minutes to wait before scheduling a remote push operation
previously failed due to an offline remote server.</p></div>
<div class="paragraph"><p>If a remote push operation fails because a remote server was
offline, all push operations to the same destination URL are
blocked, and the remote push is continuously retried.</p></div>
<div class="paragraph"><p>This is a Gerrit specific extension to the Git remote block.</p></div>
<div class="paragraph"><p>By default, 1 minute.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.threads"></a>remote.&lt;name&gt;.threads
</dt>
<dd>
<div class="paragraph"><p>Number of worker threads to dedicate to pushing to the repositories
described by this remote.  Each thread can push one project at a
time, to one destination URL.  Scheduling within the thread pool
is done on a per-project basis.  If a remote block describes 4
URLs, allocating 4 threads in the pool will permit some level of
parallel pushing.</p></div>
<div class="paragraph"><p>By default, 1 thread.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.authGroup"></a>remote.&lt;name&gt;.authGroup
</dt>
<dd>
<div class="paragraph"><p>Specifies the name of a group that the remote should use to access
the repositories. Multiple authGroups may be specified within a
single remote block to signify a wider access right. In the project
administration web interface the read access can be specified for
this group to control if a project should be replicated or not to the
remote.</p></div>
<div class="paragraph"><p>By default, replicates without group control, i.e replicates
everything to all remotes.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.replicatePermissions"></a>remote.&lt;name&gt;.replicatePermissions
</dt>
<dd>
<div class="paragraph"><p>If true, permissions-only projects and the refs/meta/config branch
will also be replicated to the remote site.  These projects and
branches may be needed to keep a backup or slave server current.</p></div>
<div class="paragraph"><p>By default, true, replicating everything.</p></div>
</dd>
<dt class="hdlist1">
<a id="remote.name.mirror"></a>remote.&lt;name&gt;.mirror
</dt>
<dd>
<div class="paragraph"><p>If true, replication will remove remote branches that absent locally
or invisible to the replication (i.e. read access denied via <em>authGroup</em>
option).</p></div>
<div class="paragraph"><p>By default, false, do not remove remote branches.</p></div>
</dd>
</dl></div>
<div class="paragraph"><p><a id="secure_config"></a>File <tt>secure.config</tt></p></div>
<div class="listingblock">
<div class="content">
<pre><tt>The optional file `'$site_path'/secure.config` is a Git-style config
file that provides secure values that should not be world-readable,
such as passwords. Passwords for HTTP remotes can be obtained from
this file.

[[remote.name.username]]remote.&lt;name&gt;.username::
+
Username to use for HTTP authentication on this remote, if not given
in the URL.

[[remote.name.password]]remote.&lt;name&gt;.password::
+
Password to use for HTTP authentication on this remote.


[[ssh_config]]File `~/.ssh/config`</tt></pre>
</div></div>
<div class="paragraph"><p>If present, Gerrit reads and caches <tt>~/.ssh/config</tt> at startup, and
supports most SSH configuration options.  For example:</p></div>
<div class="exampleblock">
<div class="exampleblock-content">
<div class="literalblock">
<div class="content">
<pre><tt>Host host-one.example.com:
  IdentityFile ~/.ssh/id_hostone
  PreferredAuthentications publickey</tt></pre>
</div></div>
<div class="literalblock">
<div class="content">
<pre><tt>Host mirror*.us.some.org:
  User mirror-updater
  IdentityFile ~/.ssh/id_pubmirror
  PreferredAuthentications publickey</tt></pre>
</div></div>
</div></div>
<div class="paragraph"><p>Supported options:</p></div>
<div class="ulist"><ul>
<li>
<p>
Host
</p>
</li>
<li>
<p>
Hostname
</p>
</li>
<li>
<p>
User
</p>
</li>
<li>
<p>
Port
</p>
</li>
<li>
<p>
IdentityFile
</p>
</li>
<li>
<p>
PreferredAuthentications
</p>
</li>
<li>
<p>
StrictHostKeyChecking
</p>
</li>
</ul></div>
<div class="paragraph"><p>SSH authentication must be by passwordless public key, as there is
no facility to read passphases on startup or passwords during the
SSH connection setup, and SSH agents are not supported from Java.</p></div>
<div class="paragraph"><p>Host keys for any destination SSH servers must appear in the user&#8217;s
<tt>~/.ssh/known_hosts</tt> file, and must be added in advance, before
Gerrit starts.  If a host key is not listed, Gerrit will be unable to
connect to that destination, and replication to that URL will fail.</p></div>
</div>
<hr style="
  height: 2px;
  color: silver;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
">
<div class="paragraph"><p>Part of <a href="index.html">Gerrit Code Review</a></p></div>
</div>
<div id="footnotes"><hr /></div>
<div id="footer">
<div id="footer-text">
Version 2.3<br />
Last updated 2012-03-19 10:06:38 MDT
</div>
</div>
</body>
</html>
